`
```
---
title: "London Homicides 2008 to 2020"
author: "David Harrington"
output:
flexdashboard::flex_dashboard:
social: menu
source_code: embed
---
```{r global, include=FALSE}
library(flexdashboard)
library(knitr)
library(readxl)
library(ggplot2)
library(dplyr)
library(tidyr)
library(tibble)
library(stringr)
library(lubridate)
library(leaflet)
library(leaflet.extras)
library(tidyverse)
library(reshape)
library(ggridges)
library(rgeos)
library(ggmap)
library(maptools)
library(broom)
library(mapproj)
library(htmlwidgets)
library(htmltools)
library(plotly)
# data import
library(readxl)
mmap18 <- read_excel("mmap.xlsx")
# clean up the orginal data set and eliminate redundant variables
library(dplyr)
mmap18 = select(mmap18, -6,-7,-8,-13,-14,-16,-17,-18,-19)
# reorder columns
mmap18 <- mmap18[ , c(2, 1, 8, 9,5,4,3,10,6,11,7)]
# update column names
colnames(mmap18) <- c("date", "ID", "latitude", "longitude", "ethnicity", "sex", "age", "ageGroup", "weapon", "borough", "status")
# change strings to factors
mmap18 <- mmap18 %>% mutate_if(is.character, as.factor)
# import the 2019 murder map data into R
mmap19 <- read_excel("Murdermap2019.xlsx")
mmap19 = select(mmap19, -3,-6)
mmap19$longitude <- as.numeric(mmap19$longitude)
# change strings to factors
mmap19 <- mmap19 %>% mutate_if(is.character, as.factor)
colnames(mmap19) <- c("date", "ID", "latitude", "longitude", "ethnicity", "sex", "age", "ageGroup", "weapon", "borough", "status")
# import the 2019 murder map data into R
mmap20 <- read_excel("Murdermap2020.xlsx")
mmap20 = select(mmap20, -3,-6)
mmap20 <- mmap20 %>% mutate_if(is.character, as.factor)
colnames(mmap20) <- c("date", "ID", "latitude", "longitude", "ethnicity", "sex", "age", "ageGroup", "weapon", "borough", "status")
##Merge mmap19 and mmap 20 using rbind function
mmap19_20 = rbind(mmap19,mmap20)
#change the levels for "sex" to align with mmap18
mmap19_20 <- mmap19_20 %>%
mutate(sex = fct_recode(sex,
"M" = "Male",
"F" = "Female"))
# merge mmap19_20 with mmap18 to create mmap (integrated cases from 2008 to 2020)
mmap = rbind(mmap18, mmap19_20)
# See all levels in weapon variable
levels(mmap$weapon)
# Replicate weapon column to enable re-factoring
mmap2 = cbind(mmap, weapon2=rep(mmap$weapon))
# Change levels in Weapon column to include just 4 levels Knife, Gun, Assault and Other
mmap3 <- mmap2 %>% mutate( weapon = fct_recode(weapon,
"Other" = "Arson",
"Other" = "Vehicle",
"Other" = "Drug",
"Other" = "Poison",
"Other" = "Unknown",
"Other" = "Ligature",
"Other" = "Strangulation",
"Other" = "Fire",
"Other" = "Other",
"Other" = "Blunt Object",
"Assault" = "None"))
# clean up the factor names within borough variable to enable the bind with boroughpop (ensure they are exactly the same!)
mmap33 <- mmap3 %>% mutate(borough = fct_recode(borough,
"Westminster" = "City of Westminster",
"Kingston upon Thames" = "Kingston-upon-Thames",
"Kingston upon Thames" = "Kingston Upon Thames",
"Kingston upon Thames" = "Kingston-Upon-Thames",
"Richmond upon Thames" = "Richmond"))
# Replicate date column
mmap4 = cbind(mmap33, date2=rep(mmap3$date))
# create new data frame mmap5 and separate date variable from mmap4 into year, month and day and save them as integers
mmap5 = separate(mmap4, date2, c("year", "month", "day"), "-") %>%
mutate_if(is.character, as.integer)
mmap5 <- mmap5 %>% mutate(status2 = fct_recode(status,
"Awaiting Trial" = "Awaiting trial",
"Awaiting Trial" = "Awaiting Outcome",
"Solved" = "Solved",
"Solved" = "Self Defence",
"Unsolved" = "Suspect dead",
"Unsolved" = "Unsolved"))
mmap5 <- mmap5 %>% mutate(ethnicity = fct_recode(ethnicity,
"Other" = "Mixed",
"Black" = "Black",
"Black" = "Black or Black British",
"White" = "White",
"White" = "White or White British",
"Asian" = "Asian",
"Asian" = "Asian or Asian British",
"Other" = "Unknown",
"Other" = "NA",
"Other" = "Any Other Ethnic Appearance"))
levels(mmap5$ethnicity)
# read the boroughpop file into R to access borough population data
boroughpop <- read_excel("boroughpop.xlsx")
# change column names in boroughpop
colnames(boroughpop) = c("borough", "population")
# join mmap5 and boroughpop data frames using "borough"
mmap6 <- left_join(mmap5, boroughpop, by = "borough")
# make bourough a factor variable
mmap6$borough <- as.factor(mmap6$borough)
# create new variable for counting homicides by borough and homicides per 100,000 population by borough
mmap6_sum <- mmap6 %>% select(borough, population) %>% group_by(borough) %>% mutate(count = n(), population = population, homicide_rate = (count*100000)/11/population) %>% distinct()
# create mmap 7 by filtering mmap5 to just include full year data to end of calendar 2019
mmap7 <- mmap6 %>% filter(year != "2020")
mmap7 <-data.frame(mmap7)
# remove NA cases for ethicity
mmap8 <- mmap7 %>% filter(ethnicity != "NA")
# save mmap6_sum as data frame and name the data frame mmap9
mmap9 <- as.data.frame(mmap6_sum)
# create new data frame mmap10 with just borough and homicide rate variables
mmap10 <- mmap9 %>% select(borough, homicide_rate)
# round the homicide_rate variable to 2 decimal places
mmap10$homicide_rate <- round(mmap10$homicide_rate, 2)
# arrange the data frame based on homicide rate variable descending order
mmap10 <- mmap10 %>% arrange(desc(mmap10$homicide_rate))
mmap7$year <- as.factor(mmap7$year)
# calculate sum borough population based on the 2016 ONS data for boroughs
GreaterLondonPop <- sum(boroughpop$population)
GreaterLondonPop
# create vector for Greater London Population for 2008 to 2019
GreaterLondonPopMillions <- c(7.8, 7.9, 8.0, 8.15, 8.25, 8.35, 8.5, 8.7, 8.82, 8.85, 8.9, 9.0)
# Greater London Population in 100,000s
GreaterLondon <- GreaterLondonPopMillions*10
# Greater London total homicides
LondonHomicides <- c(155, 130, 128, 121, 103, 113, 90, 120, 107, 130, 131, 149)
Year <- c(2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019)
# merge vectors into a data frame
London <- data.frame(Year, LondonHomicides, GreaterLondon)
London
# Number of homicides per 100,000 population, 2008-2019
LondonHomicideRate <- London %>% mutate(Homicide_Rate = LondonHomicides/GreaterLondon)
LondonHomicideRate$Homicide_Rate <- round(LondonHomicideRate$Homicide_Rate,2)
LondonHomicideRate$Year <- as.factor(LondonHomicideRate$Year)
str(LondonHomicideRate)
sex <- table(mmap5$sex) # Victim gender table
addmargins(sex) # Plus totals
# create new data frame to show ageGroup data by year
ageyear <- mmap7 %>%
select(ageGroup, year) %>%
group_by(ageGroup, year) %>%
tally() %>%
spread(ageGroup, n)
# calculate total homicides per ageGroup across 2008 to 2019
homicidesA <- sum(ageyear$`A. Child 0-6`, na.rm= TRUE)
homicidesB <- sum(ageyear$`B. Child 7-12`, na.rm= TRUE)
homicidesC <- sum(ageyear$`C. Teen 13-16`, na.rm= TRUE)
homicidesD <- sum(ageyear$`D. Teen 17-19`, na.rm= TRUE)
homicidesE <- sum(ageyear$`E. Adult 20-24`, na.rm= TRUE)
homicidesF <- sum(ageyear$`F. Adult 25-34`, na.rm= TRUE)
homicidesG <- sum(ageyear$`G. Adult 35-44`, na.rm= TRUE)
homicidesH <- sum(ageyear$`H. Adult 45-54`, na.rm= TRUE)
homicidesI <- sum(ageyear$`I. Adult 55-64`, na.rm= TRUE)
homicidesJ <- sum(ageyear$`J. Adult 65 over`, na.rm= TRUE)
# consolidate total homicides per ageGroup across 2008 to 2019 into a new vector homicides_ageGroup
homicides_ageGroup <- c(homicidesA, homicidesB, homicidesC, homicidesD, homicidesE, homicidesF, homicidesG, homicidesH, homicidesI, homicidesJ)
# create vector agegp with unique values for the variable "ageGroup" in mmap5
agegp <- unique(mmap5$ageGroup)
# refactor to order the values for the variable "ageGroup" from youngest to oldest
agegp <- factor(c("A. Child 0-6", "B. Child 7-12", "C. Teen 13-16", "D. Teen 17-19", "E. Adult 20-24", "F. Adult 25-34","G. Adult 35-44","H. Adult 45-54","I. Adult 55-64","J. Adult 65 over"))
# create vector to calculate average homicides per year over 11 years from 2008 to 2019
homicides_ageGroup_avg <- homicides_ageGroup/11
# create population vector by age group - Source: ONS small area population estimates mid-2016 (latest ONS survey for UK)
popn <- c(872040, 659384, 374989, 278134, 557975, 1654605, 1408946, 1151408, 828359, 1039161)
# create homicide-rate2 vector
homicide_rate2 <- homicides_ageGroup_avg / popn * 100000
# Create a data frame from vectors
mmap11 <- data.frame(agegp, round(homicide_rate2,2))
colnames(mmap11) <- c("Age_Group", "Homicide_Rate")
# calculate mean and median age for all homicides in London 2008-2020
meanAge <- mean(mmap5$age)
meanAge
medianAge <- median(mmap5$age)
medianAge
# Trends in Status
## create tables showing probability of being solved given weapon, ethnicity and borough
# by weapon type
status <- table(mmap5$weapon, mmap5$status, dnn = c("weapon", "status"))
status
statusProp <- prop.table(status, 1)
statusProp
# save as data frame
weaponStatus <- data.frame(statusProp)
# filter to just include probability of being solved
weaponStatus1 <- weaponStatus %>% filter(status == "Solved")
# change to percent
weaponStatus1$percent <- round(weaponStatus1$Freq,2)*100
mmap13 <- weaponStatus1 %>% arrange(weaponStatus1$percent)
mmap13$percent <- as.integer(mmap13$percent)
# by ethnicity
levels(mmap8$ethnicity)
status2 <- table(mmap8$ethnicity, mmap8$status, dnn = c("ethnicity", "status"))
status2
status2Prop <- round(prop.table(status2, 1),2)
status2Prop
# save as data frame
ethnicityStatus <- data.frame(status2Prop)
# filter to just include probability of being solved
ethnicityStatus1 <- ethnicityStatus %>% filter(status == "Solved")
# change to percent
ethnicityStatus1$percent <- round(ethnicityStatus1$Freq,2)*100
mmap14 <- ethnicityStatus1 %>% arrange(ethnicityStatus1$percent)
# by ageGroup
levels(mmap8$ageGroup)
status4 <- table(mmap8$ageGroup, mmap8$status, dnn = c("ageGroup", "status"))
status4
status4Prop <- round(prop.table(status4, 1),2)
status4Prop
# save as data frame
AgeGroupStatus <- data.frame(status4Prop)
# filter to just include probability of being solved
AgeGroupStatus1 <- AgeGroupStatus %>% filter(status == "Solved")
# change to percent
AgeGroupStatus1$percent <- round(AgeGroupStatus1$Freq,2)*100
# by location
status3 <- table(mmap5$borough, mmap5$status, dnn = c("borough", "status"))
status3
status3Prop <- prop.table(status3, 1)
status3Prop
# save as data frame
boroughStatus <- data.frame(status3Prop)
# filter to just include probability of being solved
boroughStatus1 <- boroughStatus %>% filter(status == "Solved")
# change to percent
boroughStatus1$percent <- round(boroughStatus1$Freq,2)*100
# Install ggplot2 mapping packages
library(rgeos)
library(ggmap)
library(maptools)
library(broom)
library(mapproj)
library(rgdal)
library(leaflet)
# create Leaflet interactive cloropeth chart for Homicide Rate
# read shp file for just London boroughs
# find layer names
ogrListLayers("London_Borough_Excluding_MHW.shp")
# save shape file using readOGR
London_Borough =readOGR("London_Borough_Excluding_MHW.shp", layer="London_Borough_Excluding_MHW")
# convert coordinates into lat long degrees
proj4string(London_Borough) <- CRS("+init=epsg:27700")
London_Borough.wgs84 <- spTransform(London_Borough, CRS("+init=epsg:4326"))
# For Leaflet choropleth maps, we need to use a SpatialPolygonDataFrame
class(London_Borough.wgs84)
names(London_Borough.wgs84)
# Rename the borough variable in mmap10 to "NAME" to match the "SpatialPolygonsDataFrame" file London_Ward2.wgs84
names(mmap10)[names(mmap10) == "borough"] <- "NAME"
str(mmap10)
mmap10 <- mmap10 %>% mutate(NAME = fct_recode(NAME,
"City of London" = "City and County of the City of London",
"Westminster" = "City of Westminster"))
levels(mmap10$NAME)
# merge mmap data into London_Ward.wgs84 SpatialPolygonsDataFrame using "DISTRICT"
merge.mmap10 <- sp::merge(London_Borough.wgs84, mmap10, by = "NAME", duplicateGeoms = TRUE)
# create a discrete colour scale based on quantiles for five levels
bins <- quantile(
mmap10$homicide_rate,
probs = seq(0,1,.2), names = FALSE, na.rm = TRUE)
bins
# bins now contains five sequential colour levels so that 20 per cent of the data falls within each bin. The following histogram visualises the breaks used to create the scale.
ggplot(data = mmap10,
aes(x = homicide_rate)) +
geom_histogram(colour = "white", bins = 40) +
geom_vline(
xintercept = quantile(
mmap10$homicide_rate,
probs = seq(0,1,0.2), na.rm = TRUE),
colour = "red", lwd = 1, lty = 2)
```
```
```
`
Homicide Summary {data-orientation=Column}
=======================================================================
Column {data-width=500}
-----------------------------------------------------------------------
### After declining from 2008, the number of homicides in London increased after 2014
```{r}
p1 <- ggplot(mmap7, aes(x = year)) +
geom_bar(stat='count', fill = "steelBlue", color = "Black") +
labs(x = "Year", y = "Homicides")+
theme_minimal(base_size = 9)
ggplotly(p1)
```
### The homicide rate per 100,000 population in London also increased after 2014
```{r}
p3 <- ggplot(LondonHomicideRate, aes(x= Year, y=Homicide_Rate)) +
geom_bar(stat="identity", fill="steelBlue", color = "black")+
labs(x = "Year", y = "Homicide Rate")+
theme_minimal(base_size = 9)
ggplotly(p3)
```
Column {data-width=650}
-----------------------------------------------------------------------
### Homicide rates are highest in the centre of London - peaking at over 7 victims per 100,000 in City of London
```{r}
# add the colour scale to the choropleth map.
pal <- colorBin(
"YlOrRd",
domain = mmap10$homicide_rate,
bins = bins
)
# add the colour scale to the choropleth map.
labels <- sprintf(
"%s
%g homicide_rate",
merge.mmap10$NAME,
merge.mmap10$homicide_rate
) %>% lapply(htmltools::HTML)
title <- tags$div(
HTML('London Homicide Rates
')
)
p3 <- leaflet(merge.mmap10) %>%
setView(lng = -0.118092 , lat = 51.509865, zoom = 9)
p3 %>% addPolygons(
fillColor = ~pal(homicide_rate),
weight = 2,
opacity = 0.5,
color = "black",
dashArray = "3",
fillOpacity = 0.7,
highlight = highlightOptions(
weight = 5,
color = "#0000FF",
dashArray = "",
fillOpacity = 0.7,
bringToFront = TRUE),
label = labels,
labelOptions = labelOptions(
style = list("font-weight" = "normal", padding = "3px 8px"),
textsize = "15px",
direction = "auto")) %>%
addLegend(pal = pal,
values = ~homicide_rate,
opacity = 0.7, title = "Homicide Rate",
position = "bottomright") %>%
addControl(title, position = "topright") %>%
setView(lng=-0.1, lat=51.51, zoom=10) %>%
addProviderTiles("Esri.NatGeoWorldMap")
```
Column
-----------------------------------------------------------------------
### The number of black victims has grown sharply since 2014 (2008-2019)
```{r}
p16 <- ggplot(mmap8, aes(x = year, fill = ethnicity)) +
geom_density(stat='count', alpha = 0.8, colour = "black") +
scale_x_continuous(breaks = c(2008:2019)) +
scale_fill_manual(values = c("red2","coral4","orange4","steelBlue"))+
labs(x = "Calendar Year", y = "Homicides", fill = "legend")+
theme_minimal(base_size = 9)
ggplotly(p16)
```
### Knives are the largest and most rapdily growing cause of homicide deaths (2008-2019)
```{r}
p17 <- ggplot(mmap8, aes(x = year, fill = weapon)) +
geom_density(stat='count', alpha = 0.8, colour = "black") +
scale_x_continuous(breaks = c(2008:2020)) +
scale_fill_manual(values = c("red2","coral4","orange4","steelBlue"))+
labs(x = "Calendar Year", y = "Homicides", fill = "legend", size = 2)+
theme_minimal(base_size = 9)
ggplotly(p17)
```
By Gender and Age {data-orientation=Column}
=======================================================================
Column {data-width=550}
-----------------------------------------------------------------------
### The median age for all London homicide victims is 30 (2008 to 2020)
```{r}
p6 <- ggplot(mmap5, aes(x = age))+
geom_density(fill = "red", alpha = 0.6)+
geom_histogram(colour = "white", fill = "steelBlue", aes(age, ..density..), alpha = 0.8, bins = 50)+
labs(x = "Victim Age", y = "Density", size = 2)+
geom_vline(xintercept= median(mmap7$age)) +
annotate("text",label = "Mean = 34.6",x = 48, y = 0.04, colour = "red2") +
geom_vline(xintercept= mean(mmap7$age),linetype=2) +
annotate("text",label = "Median = 30.0",x = 45, y = 0.035, colour = "red2")+
scale_x_continuous(limits = c(0, 100))+
theme_minimal(base_size = 10)
ggplotly(p6)
```
### The highest homicide rate is for victims in the 17-19 and 20-24 age groups (2008 - 2020)
```{r}
library(dplyr)
X <- mmap11 %>% mutate(ToHighlight = ifelse(Age_Group == "D. Teen 17-19" | Age_Group == "E. Adult 20-24", "high", "moderate" ))
p20 <- ggplot(X, aes(x = Age_Group, y = Homicide_Rate, fill = ToHighlight)) +
geom_bar(stat = 'identity', colour = "black") +
scale_fill_manual( values = c( "high"="red2", "moderate"= "steelBlue" ), guide= FALSE)+
coord_flip()+
xlab("")+
ylab("Homicide Rate (per 100,000)")+
theme_minimal(base_size = 10)
ggplotly(p20)
```
Column {data-width=550}
-----------------------------------------------------------------------
### There are large clusters of female victims near the centre of London (2008 - 2020)
```{r}
femaleVictims <- mmap5 %>%
filter(sex == 'F')
femaleVictims %>% # Map showing all point data
leaflet() %>%
setView(lng =-0.1, lat=51.51, zoom=10) %>%
addProviderTiles(providers$Esri.NatGeoWorldMap) %>%
addScaleBar %>%
addCircleMarkers(lng = ~longitude, lat = ~latitude, popup = ~paste0("", ID, "", "
", date, "
", age, "
", sex, "
", weapon, "
", borough), radius = 5, clusterOptions = markerClusterOptions)
```
```
```
### Over three quarters of all homicide victims in London are male (2008-2019)
```{r}
p50<- ggplot(mmap7, aes(x = year, fill = sex)) +
geom_bar(stat='count', position = 'fill', colour = "black") +
geom_hline(yintercept = 0.77, colour = "yellow",linetype="dashed", size =1.0) +
scale_x_discrete(breaks = c(2008:2019)) +
scale_fill_manual(values = c("red2","steelBlue"))+
labs(x = "Calendar Year", y = "Proportion", fill = "Legend")+
theme_minimal(base_size = 9)
ggplotly(p50)
```
Column
-----------------------------------------------------------------------
### A higher proportion of male homicides are young (2008-2019)
```{r}
p9 <- ggplot(mmap8, aes(x = age, fill = sex)) +
geom_density(alpha = 0.8)+
scale_fill_brewer(palette = "Set1")+
labs(fill = "Legend")+
scale_x_continuous("Victim Age")+
scale_y_continuous("Density")+
theme_minimal(base_size = 10)
ggplotly(p9)
```
### A higher proportion of black homicides are young (2008-2019)
```{r}
p13 <- ggplot(mmap8, aes(x = age, fill = ethnicity)) +
geom_density(alpha = 0.8)+
scale_fill_manual(values = c("red2","coral4","orange3","steelBlue"))+
labs(fill = "Legend")+
scale_x_continuous("Victim Age")+
scale_y_continuous("Density")+
theme_minimal(base_size = 10)
ggplotly(p13)
```
By Ethnicity and Cause of Death {data-orientation=Column}
=======================================================================
Column {data-width=550}
-----------------------------------------------------------------------
### Black victims are younger than other victims (2008-2019)
```{r}
p14 <- ggplot(data = mmap8, aes(x = reorder(ethnicity, age, "mean"), y = age), na.rm = TRUE)+ geom_boxplot() + geom_jitter(alpha = 1/5) +
ylab("Age of victim") +
xlab("Ethnicity")+
stat_summary(fun="mean", colour="red", geom="point",shape = 16, size = 4) +
theme_minimal(base_size = 10)
ggplotly(p14)
```
### Gun victims are younger than other victims (2008-2019)
```{r}
p19 <- ggplot(data = mmap8, aes(x = reorder(weapon, age, "mean"), y = age), na.rm = TRUE)+ geom_boxplot() + geom_jitter(alpha = 1/5) +
ylab("Age of victim") +
xlab("Cause of Death")+
stat_summary(fun="mean", colour="red", geom="point",shape = 16, size = 4) +
theme_minimal(base_size = 10)
ggplotly(p19)
```
```
```
Column {data-width=550}
-----------------------------------------------------------------------
### Homicides by ethnicity are spread across London but with a higher concentration of black victims in Eastern boroughs (2008-2020)
```{r}
pal2 <- colorFactor(palette = c("black", "purple", "blue", "red2"),
levels = c("Black", "White", "Asian", "Other")) # Creating a 4 colour palette
black <- mmap5 %>%
filter(ethnicity == "Black") # Grouping layers - black
white <- mmap5 %>%
filter(ethnicity == "White") # Grouping layers - white
asian <- mmap5 %>%
filter(ethnicity == "Asian") # Grouping layers - asian
other <- mmap5 %>%
filter(ethnicity == "Other") # Grouping layers - other
mmap5 %>%
leaflet() %>%
setView(lng=-0.1, lat=51.51, zoom=10) %>%
addProviderTiles("Esri.NatGeoWorldMap") %>%
addScaleBar(position = "bottomleft") %>%
addCircleMarkers(data = black,
lng = ~longitude,
lat = ~latitude,
radius = 2,
color = ~pal2(ethnicity),
group = "Black",
popup = ~paste("", ID, "", "
", date, "
", age, "
", sex, "
", weapon, "
", status)) %>%
addCircleMarkers(data = white,
lng = ~longitude,
lat = ~latitude,
radius = 2,
color = ~pal2(ethnicity),
group = "White",
popup = ~paste("", ID, "", "
", date, "
", age, "
", sex, "
", weapon, "
", status)) %>%
addCircleMarkers(data = asian,
lng = ~longitude,
lat = ~latitude,
radius = 2,
color = ~pal2(ethnicity),
group = "Asian",
popup = ~paste("", ID, "", "
", date, "
", age, "
", sex, "
", weapon, "
", status)) %>%
addCircleMarkers(data = other,
lng = ~longitude,
lat = ~latitude,
radius = 2,
color = ~pal2(ethnicity),
group = "Other",
popup = ~paste("", ID, "", "
", date, "
", age, "
", sex, "
", weapon, "
", status)) %>%
addLegend(position = "bottomright",
pal = pal2,
values = c("Black", "White", "Asian", "Other"),
title = "Legend") %>%
addLayersControl(
overlayGroups = c("Black",
"White",
"Asian",
"Other"))
```
```
```
Column
-----------------------------------------------------------------------
### Homicides involving black victims are less likely to get solved in the criminal justice system (2008-2020)
```{r}
X1 <- mmap14 %>% mutate(ToHighlight2 = ifelse(ethnicity == "Black", "low", "moderate" ))
p23 <- ggplot(X1, aes(x= reorder(ethnicity, percent), y=percent, fill =ToHighlight2))+
geom_bar(stat="identity", colour = "Black")+
scale_fill_manual(values = c( "low"="red2", "moderate"="steelBlue" ), guide=FALSE)+
coord_flip()+
labs(x = "Ethnicity", y = "Percent Solved")+
theme_minimal(base_size = 11)
ggplotly(p23)
```
### Homicides involving guns are also less likely to get solved in the criminal justice system (2008-2020)
```{r}
X1 <- mmap13 %>% mutate(ToHighlight1 = ifelse(weapon == "Gun", "low", "moderate" ))
p22 <- ggplot(X1, aes(x= reorder(weapon, percent), y=percent, fill = ToHighlight1))+
geom_bar(stat="identity", colour = "Black")+
scale_fill_manual( values = c( "low"="red2", "moderate"="steelBlue" ), guide = FALSE)+
coord_flip()+
labs(x = "Cause of Death", y = "Percent Solved")+
theme_minimal(base_size = 11)
ggplotly(p22)
```
```